package cn.iocoder.yudao.module.system.util.a_gaojian;


import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.List;

/**
 * @author lxj
 * 文件工具类
 */
public class FileUtils {
    private static final int CHUNK_SIZE = 1024 * 1024; // 切片大小为1MB

    //根据路径及文件名删除文件
    public static Boolean deleteFileByFileNameAndPath(List<String> urls) {
        try {
            for (String url : urls) {
                File desc = new File(url);
                if (desc.exists()) {
                    desc.delete();
                }
            }
        } catch (Exception e) {
            return false;
        }
        return true;
    }


    public static String moveFile(String delPath, String filePath) {
        File file = new File(filePath);
        File delFilePath = new File(delPath);
        if (delFilePath.exists()) {
            if (file.renameTo(new File(delFilePath + File.separator + file.getName()))) {
                return delFilePath + File.separator + file.getName();
            } else {
                return "false - " + file.getName();
            }
        } else {
            if (delFilePath.mkdirs()) {
                if (file.renameTo(new File(delFilePath + File.separator + file.getName()))) {
                    return delFilePath + File.separator + file.getName();
                } else {
                    return "false - " + file.getName();
                }
            }
        }
        return "false - " + file.getName();
    }

    //1. 将文件分割成小块
    //上述代码中，splitFile 方法接收两个参数：filePath 表示要上传的文件路径，chunkSize 表示每个分片的大小。
    // 在 splitFile 方法中，我们首先创建一个 FileInputStream 对象来读取文件。
    // 然后使用一个缓冲区数组 buffer 来保存每次读取的数据。在循环中，我们通过 fis.read(buffer) 方法读取数据，并将数据写入到分片文件中。最后，关闭输入流和输出流。
    public static void splitFile(String uploadPath, MultipartFile multipartFile,String fileUuidName) throws IOException {
        InputStream fis = multipartFile.getInputStream();
        byte[] buffer = new byte[CHUNK_SIZE];
        String filePath = uploadPath + File.separator + multipartFile.getOriginalFilename().substring(0, multipartFile.getOriginalFilename().lastIndexOf("."));
        File desc = new File(filePath);
        if (!desc.exists()) {
            desc.mkdirs();
        }
        int part = 1;
        int bytesRead;
        while ((bytesRead = fis.read(buffer)) != -1) {
            String fileName = filePath + File.separator + multipartFile.getOriginalFilename() + ".part" + part;
            FileOutputStream fos = new FileOutputStream(fileName);
            fos.write(buffer, 0, bytesRead);
            fos.close();
            part++;
        }
        fis.close();
        mergeFiles(uploadPath + File.separator + fileUuidName, filePath);

    }

    //3. 合并分片文件
    //最后一步是将所有的分片文件合并成完整的文件。以下是一个示例代码：
    public static void mergeFiles(String filePath, String directoryPath) throws IOException {
        File directory = new File(directoryPath);
        File[] filesInDir = directory.listFiles();

        File file = new File(filePath);
        FileOutputStream fos = new FileOutputStream(file);

        byte[] buffer = new byte[1024];
        for (File f : filesInDir) {
            FileInputStream fis = new FileInputStream(f);
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }
            fis.close();
        }

        fos.close();

        if (directory.exists()) {
            org.apache.commons.io.FileUtils.deleteDirectory(directory);
        }
    }
}
